package com.cctc.juc.source.Athread;

import java.io.Serializable;
import java.util.concurrent.*;

public class GForkJoinTask<V> implements Future<V>, Serializable {

    // --- [核心] 方法 --- //

    /**
     * [“派生” 子任务]
     * - 安排在当前任务正在运行的 ForkJoinPool 池中异步执行此 “分叉” 子任务。
     */
    public final ForkJoinTask<V> fork() {
        Thread t;
        if ((t = Thread.currentThread()) instanceof ForkJoinWorkerThread)
            ((ForkJoinWorkerThread) t).workQueue.push(this);
        else
            ForkJoinPool.common.externalPush(this);
        return this;
    }

    /**
     * [“合入” 各 “派生” 子任务的结果]
     * - 计算完成后返回结果。
     */
    public final V join() {
        int s;
        if ((s = doJoin() & DONE_MASK) != NORMAL)
            reportException(s);
        return getRawResult();
    }

    /**
     * 取消（中断）正在执行中的任务。
     * - runner.interrupt()。
     */
    @Override
    public boolean cancel(boolean mayInterruptIfRunning) {
        // ... 省略代码 ...
        return false;
    }

    /**
     * 判断任务是否被取消？
     * - mayInterruptIfRunning = true。
     */
    @Override
    public boolean isCancelled() {
        // ... 省略代码 ...
        return false;
    }

    /**
     * 判断任务是否执行结束？
     */
    @Override
    public boolean isDone() {
        // ... 省略代码 ...
        return false;
    }

    /**
     * （阻塞）获取任务执行结果。
     * - return [outcome]。
     */
    @Override
    public V get() throws InterruptedException, ExecutionException {
        // ... 省略代码 ...
        return null;
    }

    /**
     * （限时阻塞）获取任务执行结果。
     * - return [outcome] 或 throw new TimeoutException()。
     */
    @Override
    public V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
        // ... 省略代码 ...
        return null;
    }
}
